/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.frames.internos.superclasses.ControleBoletins;
import controle.gui.superclasses.InternalFrame;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.ComboBoxUtils;
import controle.gui.utils.EnabledGUIElements;
import controle.utils.Datas;
import controle.utils.Horas;
import gui.componentes.MascarasJTextField;
import gui.frames.internos.IFVisitaPesquisa;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import modelo.*;
import persistencia.dao.AbstractDAO;

/**
 *
 * @author Administrador
 */
public class ControleVisitaPesquisa extends ControleBoletins {

    private IFVisitaPesquisa frame;
    private ControleBoletimPesquisa controleBoletim;
    private Boletimpesquisa boletimPesquisa = null;
    private boolean boletimAtivo = true;
    protected int linhaSelecionadaVisitas = -1;
    //Variáveis da classe
    protected Quadra quadra = null;
    protected Logradouro logradouro = null;

    public ControleVisitaPesquisa(IFVisitaPesquisa frame, ControleBoletimPesquisa controleBoletim, Boletimpesquisa boletimPesquisa, boolean boletimAtivo) {
        super(frame);
        this.frame = frame;
        this.controleBoletim = controleBoletim;
        this.linhaSelecionadaVisitas = -1;
        this.boletimAtivo = boletimAtivo;
        if (boletimPesquisa == null) {
            this.boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        } else {
            this.boletimPesquisa = boletimPesquisa;
        }
    }

    public ControleVisitaPesquisa(InternalFrame frame) {
        super(frame);
    }

    public void inicializa() {

        frame.setVisible(true);
        inicializaEventosJTextFieldsLarvas(frame);
        if (!this.inicializaComboBoxQuadra()) {
            frame.dispose();

        }

        comportamentoNumeroLarvas(false);
    }

    public void guiAtiva(boolean estado) {

        if (!estado) {
            EnabledGUIElements.disabledJComponent(frame.comboQuadra, frame.comboTipoUnidade, frame.textDepInsp, frame.checkUltimaVisitaBoletim, frame.buttonLimpar,
                    frame.comboImovel, frame.comboLogradouro, frame.textAmostra, frame.textTubitos, frame.textAegTotal, frame.textAlbTotal, frame.textOutTotal,
                    frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE, frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI,
                    frame.textAlbA, frame.textAlbB, frame.textAlbC, frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI);
        } else {
            EnabledGUIElements.enabledJComponent(frame.comboQuadra, frame.comboTipoUnidade, frame.textDepInsp, frame.checkUltimaVisitaBoletim, frame.buttonLimpar,
                    frame.comboImovel, frame.comboLogradouro, frame.textTubitos, frame.textOutTotal,
                    frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE, frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI,
                    frame.textAlbA, frame.textAlbB, frame.textAlbC, frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI);
        }
    }

    /**
     * Limpa os elementos de
     *
     * @frame
     */
    public void limparGUI() {

        new ApagaElementosDaInterface().apagaJTextField(frame.textDepInsp, frame.textIdImovel,
                frame.textIdLogradouro, frame.textCodigoQuadra, frame.textAegTotal, frame.textAlbTotal, frame.textOutTotal, frame.textAmostra, frame.textTubitos,
                frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE, frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI,
                frame.textAlbA, frame.textAlbB, frame.textAlbC, frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI);
        new ApagaElementosDaInterface().apagaJComboBox(frame.comboImovel, frame.comboLogradouro, frame.comboQuadra, frame.comboTipoUnidade);

        EnabledGUIElements.disabledJComponent(frame.comboLogradouro, frame.comboImovel, frame.textAmostra);
        comportamentoNumeroLarvas(false);

        frame.groupPendencia.clearSelection();
        frame.checkUltimaVisitaBoletim.setSelected(false);
        frame.checkQuartConcluido.setSelected(false);
        boletimPesquisa = null;

    }

    /**
     * Cria a visita
     *
     * @return
     */
    public Visitapesquisa criaVisita(IFVisitaPesquisa frame, Boletimpesquisa boletim) {

        Visitapesquisa visita = new Visitapesquisa();

        //Verifica se os campos estão preenchidos
        //Verifica se a quadra foi definida
        if (!frame.comboQuadra.getSelectedItem().equals("Selecione...")) {
            //Verifica se o logradouro foi definido
            if (!frame.comboLogradouro.getSelectedItem().equals("Selecione...")) {
                //Verifica se o imóvel foi definido
                if (!frame.comboImovel.getSelectedItem().equals("Selecione...")) {
                    //Verifica se o tipo de unidade foi definido
                    if (frame.comboTipoUnidade.getSelectedIndex() != 0) {
                        if (this.verificaJTextFieldVazios(frame.textDepInsp)) {
                            JOptionPane.showMessageDialog(frame, "O campo de número de depósitos inspecionados ainda não foi preenchido!", "Atenção!", JOptionPane.WARNING_MESSAGE);
                            return null;
                        }

                        //Verifica se o campo tubitos foi preenchdio
                        if (frame.textTubitos.getText().isEmpty()) {
                            JOptionPane.showMessageDialog(frame, "O campo número de túbitos deve ser preenchido!\n"
                                    + "Caso não tenha sido coletado nenhum túbito insira o número zero.",
                                    "Atenção!", JOptionPane.WARNING_MESSAGE);
                            return null;
                        }

                        //Verifica se o campo tubitos foram preenchidos sem preencher o campo amostra
                        if (!frame.textTubitos.getText().equals("0")) {
                            if (!frame.textTubitos.getText().isEmpty()
                                    && frame.textAmostra.getText().isEmpty()) {
                                JOptionPane.showMessageDialog(frame,
                                        "O campo de número de amostra não pode ficar vazio se o campo de número de túbitos estiver preenchido!",
                                        "Atenção!", JOptionPane.WARNING_MESSAGE);
                                return null;
                            }
                        }

                        try {
                            //Captura a hora
                            Time hora;
                            if (frame.textHora.getText().isEmpty()) {
                                hora = Horas.getHoraAgora();
                            } else {
                                hora = Horas.getTime(frame.textHora.getText());
                            }

                            Quadra quadra = (Quadra) AbstractDAO.consultar("Quadra", "idLocalidade=" + boletim.getLocalidade().getIdLocalidade() + " AND codigo='" + frame.comboQuadra.getSelectedItem() + "'").get(0);

                            //Verifica se esta quadra foi concluída
                            Integer idVisitaAtual = null;
                            if (!frame.textIdVisita.getText().isEmpty()) {
                                idVisitaAtual = Integer.parseInt(frame.textIdVisita.getText());
                            }
                            try {
                                if (verificaQuadraConcluida(controleBoletim.setVisitas, quadra, idVisitaAtual)) {
                                    JOptionPane.showMessageDialog(frame,
                                            "Esta quadra já foi concluída neste boletim",
                                            "Atenção!", JOptionPane.WARNING_MESSAGE);
                                    return null;
                                }
                            } catch (NullPointerException ex) {
                            }

                            Logradouro log = (Logradouro) AbstractDAO.consultar("Logradouro", "idMunicipio=" + boletim.getMunicipio().getIdMunicipio() + " AND nome='" + frame.comboLogradouro.getSelectedItem() + "'").get(0);
                            StringTokenizer tok = new StringTokenizer(frame.comboImovel.getSelectedItem().toString(), " - ");
                            String numeroImovel = tok.nextToken();
                            String compImovel = tok.nextToken("").replaceAll(" - ", "");
                            if (compImovel.equals("")) {
                                compImovel = "' AND complemento is null";

                            } else {
                                compImovel = "' AND complemento='" + compImovel + "'";
                            }
                            Imovel imo = (Imovel) AbstractDAO.consultar("Imovel", "idLogradouro=" + log.getIdLogradouro() + " AND numero='" + numeroImovel
                                    + compImovel).get(0);
                            String tipo = frame.comboTipoUnidade.getSelectedItem().toString();
                            int dep = new MascarasJTextField().getInteger(frame.textDepInsp);
                            boolean ult = frame.checkUltimaVisitaBoletim.isSelected();
                            boolean examinadoLaboratorio = false;
                            Integer numeroTubitos = !frame.textTubitos.getText().isEmpty() ? Integer.parseInt(frame.textTubitos.getText()) : null;
                            Integer numeroAmostra = !frame.textAmostra.getText().isEmpty() ? Integer.parseInt(frame.textAmostra.getText()) : null;

                            //Verifica os campos de número de larvas examinadas
                            Integer larvAeg = !frame.textAegTotal.getText().isEmpty() ? Integer.parseInt(frame.textAegTotal.getText()) : null;
                            Integer larvAlb = !frame.textAlbTotal.getText().isEmpty() ? Integer.parseInt(frame.textAlbTotal.getText()) : null;
                            Integer larvOut = !frame.textOutTotal.getText().isEmpty() ? Integer.parseInt(frame.textOutTotal.getText()) : null;

                            visita = new Visitapesquisa(quadra, log, imo, tipo, numeroTubitos, numeroAmostra, larvAeg,
                                    larvAlb, larvOut, examinadoLaboratorio, dep, ult, frame.checkQuartConcluido.isSelected(), hora);
                            this.criaLarvasDeposito(visita, frame);

                            //Verifica o Id da visita
                            if (!frame.textIdVisita.getText().trim().isEmpty()) {
                                visita.setIdVisitaPesquisa(Integer.parseInt(frame.textIdVisita.getText()));
                            }

                            //Verifica o Id do boletim
                            if (!frame.textIdBoletim.getText().trim().isEmpty()) {
                                Boletimpesquisa bol = new Boletimpesquisa();
                                bol.setIdBoletimPesquisa(new MascarasJTextField().getInteger(frame.textIdBoletim));
                                visita.setBoletimpesquisa(bol);
                            }

                            return visita;

                        } catch (ParseException ex) {
                            JOptionPane.showMessageDialog(frame, "Erro ao manipular a Hora.", "Erro", JOptionPane.ERROR_MESSAGE);
                        }

                    } else {
                        JOptionPane.showMessageDialog(frame, "O tipo de unidade deve ser definido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    JOptionPane.showMessageDialog(frame, "O imóvel deve ser definido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                }
            } else {

                JOptionPane.showMessageDialog(frame, "O logradouro deve ser definido.", "Atenção!", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "A quadra deve ser definida.", "Atenção!", JOptionPane.WARNING_MESSAGE);
        }

        return null;

    }

    /**
     * Exibe a visita na GUI que foi selecionada na tabela de visitas do boletim
     */
    public void preencheGUI() {

        DefaultTableModel modeloVisitas = (DefaultTableModel) controleBoletim.frame.tabelaVisitas.getModel();

        //Captura a linha selecionada na tabela
        linhaSelecionadaVisitas = controleBoletim.frame.tabelaVisitas.getSelectedRow();

        Visitapesquisa visita = null;

        //Captura a visita na HashSet de visitas do boletim
        List<Visitapesquisa> list = new ArrayList<Visitapesquisa>((Set<Visitapesquisa>) controleBoletim.setVisitas);

        for (int index = 0; index < list.size(); index++) {
            if (modeloVisitas.getValueAt(linhaSelecionadaVisitas, 0) != null && list.get(index).getIdVisitaPesquisa() != null) {
                if (list.get(index).getIdVisitaPesquisa().equals(Integer.parseInt(modeloVisitas.getValueAt(linhaSelecionadaVisitas, 0).toString()))) {
                    visita = list.get(index);
                    break;
                } else {
                    visita = null;
                }
            } else if (!modeloVisitas.getValueAt(linhaSelecionadaVisitas, 1).toString().isEmpty() && list.get(index).getHora() != null) {
                if (modeloVisitas.getValueAt(linhaSelecionadaVisitas, 1).toString().equals(list.get(index).getHora().toString())) {
                    visita = list.get(index);
                    break;
                } else {
                    visita = null;
                }
            }
        }

        if (visita != null) {

            //Preenche os elementos da GUI
            if (modeloVisitas.getValueAt(linhaSelecionadaVisitas, 0) != null) {
                frame.textIdVisita.setText(modeloVisitas.getValueAt(linhaSelecionadaVisitas, 0).toString());
            }
            String complemento = "";
            if (visita.getImovel().getComplemento() != null) {
                complemento = visita.getImovel().getComplemento();
            }
            frame.textIdBoletim.setText(controleBoletim.frame.textId.getText());
            frame.textHora.setText(visita.getHora().toString());
            frame.textCodigoQuadra.setText(visita.getQuadra().getIdQuadra().toString());
            frame.comboQuadra.setSelectedItem(visita.getQuadra().getCodigo());
            frame.textIdLogradouro.setText(visita.getLogradouro().getIdLogradouro() + "");
            frame.comboLogradouro.setSelectedItem(visita.getLogradouro().getNome());
            frame.textIdImovel.setText(visita.getImovel().getIdImovel().toString());
            frame.comboImovel.setSelectedItem(visita.getImovel().getNumero() + " - " + complemento);
            frame.comboTipoUnidade.setSelectedItem(visita.getTipoUnidade());
            frame.textAegTotal.setText(visita.getLarvasAeg() != null ? visita.getLarvasAeg().toString() : "");
            frame.textAlbTotal.setText(visita.getLarvasAlb() != null ? visita.getLarvasAlb().toString() : "");
            frame.textOutTotal.setText(visita.getLarvasOut() != null ? visita.getLarvasOut().toString() : "");
            frame.textDepInsp.setText(visita.getDepositosInspecionados().toString());
            frame.textAmostra.setText(visita.getNumeroAmostra() != null ? visita.getNumeroAmostra().toString() : "");
            frame.textTubitos.setText(visita.getNumeroTubitos() != null ? visita.getNumeroTubitos().toString() : "");
            frame.checkUltimaVisitaBoletim.setSelected(visita.isUltimaVisitaBoletim());
            frame.checkQuartConcluido.setSelected(visita.isQuadraConcluida());

            this.preencheGuiVisitaDeposito(visita, frame);

            this.guiAtiva(boletimAtivo);
        }
    }

    /**
     * Inserir a compra/venda do produto na tabela de produtos
     */
    public void inserirAlterarLinha() {

        //Verifica se o boletim está ativo
        if (this.boletimAtivo) {

            //Cria um boletim na memória a partir do Iframe 
            if (boletimPesquisa == null) {
                boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
            }

            //Captura o objeto
            Visitapesquisa visita = this.criaVisita(frame, boletimPesquisa);

            if (visita != null) {

                //Verifica se a visita será inserido na tabela ou se simplesmente aterará uma linha
                if (frame.textIdVisita.getText().trim().isEmpty() && linhaSelecionadaVisitas == -1) {

                    //Insere a visita no objeto
                    controleBoletim.setVisitas.add(visita);
                    controleBoletim.setTabelaVisitas();

                } else {

                    //Altera a visita no objeto
                    List<Visitapesquisa> list = new ArrayList<Visitapesquisa>(controleBoletim.setVisitas);
                    list.set(linhaSelecionadaVisitas, visita);
                    controleBoletim.setVisitas = new TreeSet<Visitapesquisa>(list);
                    controleBoletim.setTabelaVisitas();

                }

                frame.dispose();
            }
        }

    }

    /**
     * Carrega o próximo número de amostra automaticamente para este ano e
     * agente
     */
    public void carregaNumeroAmostra() {

        //Verifica se o campo de tubitos está preenchido
        if (!frame.textTubitos.getText().isEmpty()
                && !frame.textTubitos.getText().equals("0")) {

            //Libera o campo de amostra
            frame.textAmostra.setEnabled(true);

            if (boletimPesquisa == null) {
                boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
            }

            //Verifica se a visita já está cadastrada e tenta recuperar o número de amostra da mesma
            //Percorre todas as visitas da gui
            for (Iterator it = controleBoletim.setVisitas.iterator(); it.hasNext();) {
                Visitapesquisa obj = (Visitapesquisa) it.next();

                //Verifica se há alguma visita na tabela igual a esta atual no frame
                if ((!frame.textIdVisita.getText().isEmpty() && obj.getIdVisitaPesquisa().equals(Integer.parseInt(frame.textIdVisita.getText())))
                        || (!frame.textHora.getText().isEmpty() && frame.textHora.getText().equals(obj.getHora().toString()))) {

                    //Verifica se o número da amostra está na visita atual da tabela
                    if (obj.getNumeroAmostra() != null) {
                        //Verifica se o número da amostra não é duplicada
                        if (!this.verificaNumeroAmostraDuplicada(obj, controleBoletim.setVisitas)
                                && obj.getNumeroAmostra() != null) {
                            //Copia o número de amostra da visita da tabela na Gui para esta no frame atual
                            frame.textAmostra.setText(getMaiorNumeroAmostra(obj.getNumeroAmostra()));
                            comportamentoNumeroLarvas(true);
                            return;

                        }

                        //Caso o número da amostra não esteja na Gui, busca no bd pelo id da visita
                    } else if (!frame.textIdVisita.getText().isEmpty()) {

                        Visitapesquisa visBd = (Visitapesquisa) AbstractDAO.consultar("Visitapesquisa", "idVisitaPesquisa=" + frame.textIdVisita.getText()).get(0);

                        //Verifica se o número da amostra não é duplicada
                        if (!this.verificaNumeroAmostraDuplicada(visBd, controleBoletim.setVisitas)
                                && visBd.getNumeroAmostra() != null) {
                            //Copia o número de amostra da visita do Bd para esta no frame atual
                            frame.textAmostra.setText(getMaiorNumeroAmostra(visBd.getNumeroAmostra()));
                            comportamentoNumeroLarvas(true);
                            return;
                        }
                    }
                }
            }

            //Carrega no bd o maior número de amostra presente na última visita do agente neste ano
            //Pega o último boletim deste agente
            String ano = new SimpleDateFormat("yyyy").format(boletimPesquisa.getData());
            List<Visitapesquisa> listVisitas = AbstractDAO.consultar("from Visitapesquisa v left join fetch v.boletimpesquisa as b where "
                    + "b.agente.idAgente=" + boletimPesquisa.getAgente().getIdAgente() + " AND b.data >='" + ano + "-01-01' AND b.data <='" + ano
                    + "-12-31' order by v.numeroAmostra desc");

            Integer amostra = -1;

            //Verifica se foi encontrado alguma visita deste ano, e se há número de amostra no bd
            if (listVisitas != null && listVisitas.size() > 0 && listVisitas.get(0).getNumeroAmostra() != null) {

                //Captura o maior valor de amostra encontrado no bd para esta data e agente
                amostra = listVisitas.get(0).getNumeroAmostra() + 1;
            }

            //Verifica se na Gui há um número de amostra maior do que o encontrado até agora
            if (!controleBoletim.setVisitas.isEmpty()) {

                for (Iterator it = controleBoletim.setVisitas.iterator(); it.hasNext();) {
                    Visitapesquisa visita = (Visitapesquisa) it.next();

                    if (visita.getNumeroAmostra() != null && visita.getNumeroAmostra() >= amostra) {
                        //Instancia a amostra
                        amostra = visita.getNumeroAmostra() + 1;
                    }
                }
            }

            //Caso não tenha sido encontrado nenhuma visita no bd
            if (amostra.equals(-1)) {
                amostra = 1;
            }

            frame.textAmostra.setText(getMaiorNumeroAmostra(boletimPesquisa.getAgente().getIdAgente(), amostra, Datas.getYear(boletimPesquisa.getData())));
            comportamentoNumeroLarvas(true);

        } else {
            frame.textAmostra.setEnabled(false);
            frame.textAmostra.setText("");
            comportamentoNumeroLarvas(false);
        }
    }

    /**
     * Retorna o maior número da amostra, o incremento do encontrado pela Gui ou
     * o incremento do o número do BD
     */
    public String getMaiorNumeroAmostra(Integer idAgente, Integer amostraGui, Integer anoBoletim) {

        Agente agente = null;

        //Busca no bd o agente do boletim
        if (idAgente != null) {
            agente = (Agente) AbstractDAO.consultar("Agente", "idAgente=" + idAgente).get(0);
        }

        //Caso o agente tenha sido encontrado, compara e retorna o maior número de amostra
        if (agente != null && idAgente != null && agente.getNumeroAmostra() != null && anoBoletim != null) {

            //Verifica se o ano do boletim é o mesmo da amostra do agente
            if (agente.getAnoAmostra().equals(anoBoletim)) {
                
                Integer novaAmostraAgente = agente.getNumeroAmostra() + 1;
                if (novaAmostraAgente > amostraGui) {
                    return novaAmostraAgente.toString();
                }
                
            } 
        }

        //Caso não tenha sido encontrado o agente ou o seu número (para o ano correto), retorna o número da amostra do mesmo
        return amostraGui.toString();

    }

    public String getMaiorNumeroAmostra(Integer amostraGui) {
        return this.getMaiorNumeroAmostra(null, amostraGui, null);
    }

    /**
     * Evento que verifica se o campo de número de túbitos está preenchido
     */
    public void eventoFocusLostVerificaTextTubitos() {
        if (frame.textTubitos.getText().isEmpty()) {
            frame.textAmostra.setText("");
            frame.textAmostra.setEnabled(false);
        }
    }

    /**
     * Evento que configura o comportamento dos campos de número de larvas
     */
    public void comportamentoNumeroLarvas(boolean ativo) {

        if (ativo) {
            EnabledGUIElements.enabledJComponent(frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE,
                    frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI, frame.textAlbA, frame.textAlbB, frame.textAlbC,
                    frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI, frame.textOutTotal);
            new ApagaElementosDaInterface().apagaJTextField(false, frame.textAegTotal, frame.textAlbTotal, frame.textOutTotal);
            this.somaLarvasAeg(frame);
            this.somaLarvasAlb(frame);

        } else {
            EnabledGUIElements.disabledJComponent(frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE,
                    frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI, frame.textAlbA, frame.textAlbB, frame.textAlbC,
                    frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI, frame.textOutTotal);
            new ApagaElementosDaInterface().apagaJTextField(frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE,
                    frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI, frame.textAlbA, frame.textAlbB, frame.textAlbC,
                    frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI);
            this.somaLarvasAeg(frame);
            this.somaLarvasAlb(frame);
            frame.textOutTotal.setText("");

        }

    }

    /**
     * Evento do ComboBox de Logradouro
     */
    public void comboBoxLogradouroCarregaComboBoxImovel() {

        if (boletimPesquisa == null) {
            boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (frame.comboLogradouro.getSelectedIndex() != 0) {
            if (frame.comboLogradouro.getSelectedItem() != null) {
                String nomeLog = frame.comboLogradouro.getSelectedItem().toString();

                if (boletimPesquisa.getLocalidade() != null) {
                    this.logradouro = (Logradouro) AbstractDAO.consultar("Logradouro", "nome='" + nomeLog
                            + "' AND idMunicipio=" + boletimPesquisa.getMunicipio().getIdMunicipio()).get(0);

                    List<Imovel> listImo = AbstractDAO.consultar(
                            "from Imovel i left join fetch i.logradouro lg left join fetch i.quadra q where lg.idLogradouro="
                            + this.logradouro.getIdLogradouro() + " AND q.idQuadra=" + this.quadra.getIdQuadra() + " order by numero, complemento");

                    if (listImo.size() > 0) {
                        frame.comboImovel.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", listImo));
                        frame.comboImovel.setEnabled(true);

                    } else {
                        frame.comboImovel.setModel(new DefaultComboBoxModel(new String[]{"Selecione..."}));
                        frame.comboImovel.setEnabled(false);
                        JOptionPane.showMessageDialog(frame, "Este logradouro ainda não tem nenhum imóvel cadastrado.", "Atenção", JOptionPane.WARNING_MESSAGE);
                    }
                } else {
                    frame.comboImovel.setEnabled(false);
                    JOptionPane.showMessageDialog(frame, "Favor selecionar uma localidade para o boletim.", "Atenção!", JOptionPane.WARNING_MESSAGE);
                }
            }
        } else {
            frame.comboImovel.setSelectedIndex(0);
            frame.comboImovel.setEnabled(false);
        }
    }

    /**
     * Inicializa o comboBox de Quadras
     */
    public boolean inicializaComboBoxQuadra() {

        if (boletimPesquisa == null) {
            boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (boletimPesquisa.getMunicipio() != null) {
            if (boletimPesquisa.getLocalidade() != null) {
                List<Quadra> listQuaCodigo = AbstractDAO.consultar(
                        "from Quadra q left join fetch q.localidade l where l.idLocalidade=" + boletimPesquisa.getLocalidade().getIdLocalidade() + " order by q.codigo");
                if (listQuaCodigo.size() > 0) {
                    frame.comboQuadra.setModel(ComboBoxUtils.inicializaComboBoxGenerico("Selecione...", listQuaCodigo));
                    return true;
                } else {
                    JOptionPane.showMessageDialog(frame, "A localidade selecionada no boletim não tem nenhuma quadra cadastrada.", "Atenção", JOptionPane.WARNING_MESSAGE);
                }
            } else {
                JOptionPane.showMessageDialog(frame, "A localidade do boletim não foi selecionada.", "Atenção", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "O município do boletim não foi selecionado.", "Atenção", JOptionPane.WARNING_MESSAGE);
        }

        return false;
    }

    /**
     * Inicializa o comboBox de Logradouro
     */
    public boolean inicializaComboBoxLogradouro() {

        if (boletimPesquisa == null) {
            boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (boletimPesquisa.getLocalidade() != null) {
            if (frame.comboQuadra.getSelectedIndex() > 0 && this.quadra != null) {
                List<String> list = this.getListLogradourosPorQuadra(this.quadra);
                DefaultComboBoxModel model = new DefaultComboBoxModel();
                model.addElement("Selecione...");
                for (int i = 0; i < list.size(); i++) {
                    model.addElement(list.get(i));
                }
                frame.comboLogradouro.setModel(model);
                return true;

            } else {
                JOptionPane.showMessageDialog(frame, " A quadra deve ser selecionada.", "Atenção", JOptionPane.WARNING_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(frame, "A localidade do boletim não foi selecionada.", "Atenção", JOptionPane.WARNING_MESSAGE);
        }

        return false;
    }

    /**
     * Realiza o evento do comboboxQuadra
     *
     * @return
     */
    public boolean eventoComboBoxQuadra(JComboBox comboQuadra, JComboBox comboLogradouro, JComboBox comboImovel) {

        if (boletimPesquisa == null) {
            boletimPesquisa = controleBoletim.criaBoletim(JOptionPane.YES_OPTION);
        }

        if (comboQuadra.getSelectedIndex() > 0) {

            //Captura a quadra selecionada
            List<Quadra> listQua = AbstractDAO.consultar("Quadra", "idLocalidade=" + boletimPesquisa.getLocalidade().getIdLocalidade() + " AND codigo="
                    + comboQuadra.getSelectedItem().toString());

            if (listQua.isEmpty()) {
                EnabledGUIElements.disabledJComponent(comboLogradouro, comboImovel);
                new ApagaElementosDaInterface().apagaModelJComboBox(comboLogradouro, comboImovel);
                this.quadra = null;
                return false;

            } else {
                EnabledGUIElements.enabledJComponent(comboLogradouro);
                this.quadra = listQua.get(0);

            }

            //Carrega o combobox de logradouro
            if (this.inicializaComboBoxLogradouro()) {
                return true;
            }
        } else {
            comboLogradouro.setSelectedIndex(0);
            comboImovel.setSelectedIndex(0);
            comboLogradouro.setEnabled(false);
            comboImovel.setEnabled(false);
        }
        return false;
    }

    /**
     * Soma o total de larvas de Aeg
     */
    public void somaLarvasAeg(IFVisitaPesquisa frame) {

        somaLarvasTotais(frame.textAegTotal, frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE,
                frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI);

    }

    /**
     * Soma o total de larvas de Alb
     */
    public void somaLarvasAlb(IFVisitaPesquisa frame) {
        somaLarvasTotais(frame.textAlbTotal, frame.textAlbA, frame.textAlbB, frame.textAlbC,
                frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI);
    }

    /**
     * Realiza a soma de todos os JTextFields do Array insere o valor em
     * textTotal
     */
    public void somaLarvasTotais(JTextField textTotal, JTextField... array) {

        Integer count = 0;

        for (int i = 0; i < array.length; i++) {
            if (array[i] != null) {
                if (!array[i].getText().isEmpty()) {
                    count += Integer.parseInt(array[i].getText());
                }
            } else {
                //array[i].setText("0");
            }
        }

        //if (!count.equals(0)) {
        textTotal.setText(count.toString());
        //} else {
        //    textTotal.setText("");
        //}

    }

    /**
     * Cria visitadeposito a partir da gui
     */
    public void criaLarvasDeposito(Visitapesquisa visita, IFVisitaPesquisa frame) {

        verificaAmostraLarvaDeposito(frame);

        if (!frame.textAegA.getText().isEmpty()) {
            visita.setAegA(Integer.parseInt(frame.textAegA.getText()));
        }
        if (!frame.textAegB.getText().isEmpty()) {
            visita.setAegB(Integer.parseInt(frame.textAegB.getText()));
        }
        if (!frame.textAegC.getText().isEmpty()) {
            visita.setAegC(Integer.parseInt(frame.textAegC.getText()));
        }
        if (!frame.textAegD.getText().isEmpty()) {
            visita.setAegD(Integer.parseInt(frame.textAegD.getText()));
        }
        if (!frame.textAegE.getText().isEmpty()) {
            visita.setAegE(Integer.parseInt(frame.textAegE.getText()));
        }
        if (!frame.textAegF.getText().isEmpty()) {
            visita.setAegF(Integer.parseInt(frame.textAegF.getText()));
        }
        if (!frame.textAegG.getText().isEmpty()) {
            visita.setAegG(Integer.parseInt(frame.textAegG.getText()));
        }
        if (!frame.textAegH.getText().isEmpty()) {
            visita.setAegH(Integer.parseInt(frame.textAegH.getText()));
        }
        if (!frame.textAegI.getText().isEmpty()) {
            visita.setAegI(Integer.parseInt(frame.textAegI.getText()));
        }
        if (!frame.textAlbA.getText().isEmpty()) {
            visita.setAlbA(Integer.parseInt(frame.textAlbA.getText()));
        }
        if (!frame.textAlbB.getText().isEmpty()) {
            visita.setAlbB(Integer.parseInt(frame.textAlbB.getText()));
        }
        if (!frame.textAlbC.getText().isEmpty()) {
            visita.setAlbC(Integer.parseInt(frame.textAlbC.getText()));
        }
        if (!frame.textAlbD.getText().isEmpty()) {
            visita.setAlbD(Integer.parseInt(frame.textAlbD.getText()));
        }
        if (!frame.textAlbE.getText().isEmpty()) {
            visita.setAlbE(Integer.parseInt(frame.textAlbE.getText()));
        }
        if (!frame.textAlbF.getText().isEmpty()) {
            visita.setAlbF(Integer.parseInt(frame.textAlbF.getText()));
        }
        if (!frame.textAlbG.getText().isEmpty()) {
            visita.setAlbG(Integer.parseInt(frame.textAlbG.getText()));
        }
        if (!frame.textAlbH.getText().isEmpty()) {
            visita.setAlbH(Integer.parseInt(frame.textAlbH.getText()));
        }
        if (!frame.textAlbI.getText().isEmpty()) {
            visita.setAlbI(Integer.parseInt(frame.textAlbI.getText()));
        }
        if (!frame.textAegTotal.getText().isEmpty()) {
            visita.setLarvasAeg(Integer.parseInt(frame.textAegTotal.getText()));
        }
        if (!frame.textAlbTotal.getText().isEmpty()) {
            visita.setLarvasAlb(Integer.parseInt(frame.textAlbTotal.getText()));
        }
        if (!frame.textOutTotal.getText().isEmpty()) {
            visita.setLarvasOut(Integer.parseInt(frame.textOutTotal.getText()));
        }

    }

    /**
     * Preenche os componentes da Gui referentes ao objeto
     * GuiVisitaDepositoPositivoTipo
     *
     * @param visDep
     */
    public void preencheGuiVisitaDeposito(Visitapesquisa visDep, IFVisitaPesquisa frame) {

        if (visDep != null) {
            if (visDep.getAegA() != null) {
                frame.textAegA.setText(visDep.getAegA().toString());
            }
            if (visDep.getAegB() != null) {
                frame.textAegB.setText(visDep.getAegB().toString());
            }
            if (visDep.getAegC() != null) {
                frame.textAegC.setText(visDep.getAegC().toString());
            }
            if (visDep.getAegD() != null) {
                frame.textAegD.setText(visDep.getAegD().toString());
            }
            if (visDep.getAegE() != null) {
                frame.textAegE.setText(visDep.getAegE().toString());
            }
            if (visDep.getAegF() != null) {
                frame.textAegF.setText(visDep.getAegF().toString());
            }
            if (visDep.getAegG() != null) {
                frame.textAegG.setText(visDep.getAegG().toString());
            }
            if (visDep.getAegH() != null) {
                frame.textAegH.setText(visDep.getAegH().toString());
            }
            if (visDep.getAegI() != null) {
                frame.textAegI.setText(visDep.getAegI().toString());
            }
            if (visDep.getAlbA() != null) {
                frame.textAlbA.setText(visDep.getAlbA().toString());
            }
            if (visDep.getAlbB() != null) {
                frame.textAlbB.setText(visDep.getAlbB().toString());
            }
            if (visDep.getAlbC() != null) {
                frame.textAlbC.setText(visDep.getAlbC().toString());
            }
            if (visDep.getAlbD() != null) {
                frame.textAlbD.setText(visDep.getAlbD().toString());
            }
            if (visDep.getAlbE() != null) {
                frame.textAlbE.setText(visDep.getAlbE().toString());
            }
            if (visDep.getAlbF() != null) {
                frame.textAlbF.setText(visDep.getAlbF().toString());
            }
            if (visDep.getAlbG() != null) {
                frame.textAlbG.setText(visDep.getAlbG().toString());
            }
            if (visDep.getAlbH() != null) {
                frame.textAlbH.setText(visDep.getAlbH().toString());
            }
            if (visDep.getAlbI() != null) {
                frame.textAlbI.setText(visDep.getAlbI().toString());
            }
        }
    }

    public void inicializaEventosJTextFieldsLarvas(final IFVisitaPesquisa frame) {

        JTextField[] argsAeg = {frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE,
            frame.textAegF, frame.textAegG, frame.textAegH, frame.textAegI};

        JTextField[] argsAlb = {frame.textAlbA, frame.textAlbB, frame.textAlbC, frame.textAlbD,
            frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI};

        for (int i = 0; i < argsAeg.length; i++) {
            argsAeg[i].addFocusListener(new java.awt.event.FocusAdapter() {
                @Override
                public void focusLost(java.awt.event.FocusEvent evt) {
                    somaLarvasAeg(frame);
                }
            });

            argsAeg[i].addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    somaLarvasAeg(frame);
                }
            });
        }

        for (int i = 0; i < argsAlb.length; i++) {
            argsAlb[i].addFocusListener(new java.awt.event.FocusAdapter() {
                @Override
                public void focusLost(java.awt.event.FocusEvent evt) {
                    somaLarvasAlb(frame);
                }
            });

            argsAlb[i].addActionListener(new java.awt.event.ActionListener() {
                @Override
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    somaLarvasAlb(frame);
                }
            });
        }
    }

    /**
     * Caso não tenha sido registrado um valor para amostra, todos os valores
     * para larvas depósito/tipo são igual a 0
     *
     * @return true - Caso tenham sido inserido os valores 0
     * @return false - Caso não tenha sido inserido nada
     */
    protected boolean verificaAmostraLarvaDeposito(IFVisitaPesquisa frame) {

        if (frame.textAmostra.getText().isEmpty()) {
            this.setSameText("0", false, frame.textAegA, frame.textAegB, frame.textAegC, frame.textAegD, frame.textAegE, frame.textAegF,
                    frame.textAegG, frame.textAegH, frame.textAegI, frame.textAlbA, frame.textAlbB, frame.textAlbC,
                    frame.textAlbD, frame.textAlbE, frame.textAlbF, frame.textAlbG, frame.textAlbH, frame.textAlbI, frame.textAegTotal,
                    frame.textAlbTotal, frame.textOutTotal);
            return true;
        }
        return false;
    }

    @Override
    public void editarVisita() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public DefaultTableModel getModelTabelaVisitas() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Integer linhaSelecionadaTabelaVisitas() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
